/**
 * 一个带头结点的单链表中的元素无序，试编写一个函数，
 * 删除表中所有介于给定的两个值（作为函数参数给出）之间元素的元素（若存在）
 */
#include <stdio.h>
#include <stdlib.h>

#define bool int
#define true !0
#define false 0

typedef struct LNode{
	int data;
	struct LNode* next;
}LNode, *LinkedList;

//初始化单链表
bool init(LinkedList &list);

//链表插入
bool insert(LinkedList &list, int data);

//链表元素展示
void print(LinkedList &list);

//删除算法
bool deleteNode(LinkedList &list,int lowData, int upperData);

int main()
{
	LinkedList list=NULL;
	init(list);
	insert(list,4);
	insert(list,3);
	insert(list,5);
	insert(list,8);
	insert(list,9);
	insert(list,6);
	insert(list,10);
	
	print(list);
	
	deleteNode(list,1,7);
	print(list);

	return 0;
}

bool init(LinkedList &list)
{
	LNode* newNode=(LNode* )malloc(sizeof(LNode));
	if(!newNode) return false;
	
	newNode->data=-1;
	newNode->next=NULL;
	list=newNode;
	return true;
}

bool insert(LinkedList &list, int data)
{
	LinkedList node=list;
	if(!node) return false;
	
	LNode* newNode=(LNode* )malloc(sizeof(LNode));
	if(!newNode) return false;
	
	newNode->next=NULL;
	newNode->data=data;
	
	while(node->next) node=node->next;
	node->next=newNode;
	return true;
}

void print(LinkedList &list)
{
	LinkedList node=list->next;
	while(node)
	{
		printf("%d ",node->data);
		node=node->next;
	}
	printf("\n");
}

bool deleteNode(LinkedList &list,int lowData, int upperData)
{
	LNode* node=list->next;	//node为遍历结点
	LNode* pre_node=list;	//node结点的前驱结点
	while(node)
	{
		if(node->data>lowData && node->data<upperData)
		{
			pre_node->next=node->next;
			free(node);
			node=pre_node->next;
		} else {
			pre_node=node;
			node=node->next;
		}
	}
	return true;
}